//Shirasu Azusa 2024.7
#include <bits/stdc++.h>
#define fi first
#define se second
#define eb emplace_back
#define mp make_pair
using namespace std;
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 i128;
template<class T,class S>
bool chmax(T &a,const S b) {return (a<b?a=b,1:0);}
template<class T,class S>
bool chmin(T &a,const S b) {return (a>b?a=b,1:0);}
int popcnt(int x) {return __builtin_popcount(x);}
int popcnt(ll x)  {return __builtin_popcountll(x);}
int topbit(int x) {return (x==0?-1:31-__builtin_clz(x));}
int topbit(ll x)  {return (x==0?-1:63-__builtin_clzll(x));}
int lowbit(int x) {return (x==0?-1:__builtin_ctz(x));}
int lowbit(ll x)  {return (x==0?-1:__builtin_ctzll(x));}

#define int long long
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
typedef pair<int,int> pii;  
typedef vector<int> vi;
typedef vector<pii> vp;
typedef tuple<int,int,int> tiii;
int read() {
  int x=0,w=1; char c=getchar(); 
  while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
  while(isdigit(c)) {x=x*10+(c-'0'); c=getchar();} 
  return x*w;
}

const int N=2e5+5,mod=1e9+7,inv2=(mod+1)/2;
int n,m,x;
char c[N];

namespace Brute {
  int y,f[1005][35][35],s;
  void add(int &x,int y) {x=(x+y>=mod?x+y-mod:x+y);}
  void solve() {
    f[0][0][0]=1; s=(1<<m)-1;
    per(i,m-1,0) y=y*2+(c[i]-'0');
    rep(i,1,n) {
      rep(p,0,s) {
        rep(q,0,s) {
          rep(r,0,s) {
            if(i==x&&r!=y) continue;
            int t=p^((q*r)&s);
            add(f[i][t][r],f[i-1][p][q]);
          }
        }
      }
    }
    int ans=0;
    rep(p,0,s) rep(q,0,s) ans=(ans+f[n][p][q]*p)%mod;
    printf("%lld\n",ans);
  }
}

namespace C {
  int ksm(int x,int y,int r=1) {
    for(;y;y>>=1,x=x*x%mod) if(y&1) r=r*x%mod;
    return r;
  }
  void solve() {
    int b=0,ans=0; while(b<m&&c[b]=='0') b++;
    rep(h,0,m-1) {
      int cl=x-1, cr=n-x, l0=0, l1=0, r0=0, r1=0, le=0, re=0;
      int bl=ksm(2,cl*m), br=ksm(2,cr*m);
      if(b<=h) {
        if(cl&1) le=0;
        else le=ksm(ksm(2,(h+1)*(cl/2)),mod-2);
        if(cr&1) re=0;
        else re=ksm(ksm(2,(h+1)*(cr/2)),mod-2);
      } else {
        le=ksm(ksm(2,(h+1)*(cl/2)),mod-2);
        re=ksm(ksm(2,(h+1)*(cr/2)),mod-2);
      }
      l1=(1-le)*bl%mod*inv2%mod, l0=(bl-l1)%mod;
      r1=(1-re)*br%mod*inv2%mod, r0=(br-r1)%mod;
      int res=(l1*r0+l0*r1)%mod;
      ans=(ans+res*ksm(2,h))%mod;
    }
    printf("%lld\n",(ans+mod)%mod);
  }
}

signed main() {
  freopen("pearl.in","r",stdin);
  freopen("pearl.out","w",stdout);
  scanf("%lld%lld%lld%s",&n,&m,&x,c);
  if(n<=1000&&m<=5) {
    Brute::solve();
    return 0;
  }
  C::solve();
  return 0;
}